// cfg 包
// 提供 Sys、Ver、Dts、Avm 配置对象
// 针对每个配置对象，提供 Load、Writ 方法
package cfg

import (
	"ZHONGYIHANGYAN/util/file"
	"ZHONGYIHANGYAN/util/net"
	"fmt"
	"sync"
)

/* 系统配置 */
type SysCfg struct {
	Lock    sync.RWMutex `json:"-"`                           // 读写锁
	LocalIp string       `json:"localIp" validate:"required"` // 本服务通讯IP
	WebPort int          `json:"webPort" validate:"required"` // Web端口
	Mysql   struct {     // Mysql服务配置
		Host     string `json:"host"`
		Port     int    `json:"port"`
		Username string `json:"username"`
		Password string `json:"password"`
		DataBase string `json:"database"` //数据库名，oms
		Url      string `json:"-"`        // Url格式 root:Bohui@123@tcp(172.17.123.88:3306)/oms_qinghua
	} `json:"mysql"`
	DownloadDir string `json:"downloadDir"`
}

/* 版本配置 */
type verCfg struct {
	Lock          sync.RWMutex `json:"-"`              // 读写锁
	Version       string       `json:"version"`        // 系统版本，示例：V1.0.0.1
	ServerVersion string       `json:"server_version"` // 后台版本，示例：2023.9.24.1
	FrontVersion  string       `json:"front_version"`  // 前端版本，示例：2023.9.24.1
}

// 指标配置结构
type QuotaCfg struct {
	Name               string     `json:"name"`
	Level              int        `json:"level"`
	EvaluationCriteria string     `json:"evaluationCriteria"`
	EvaluationScore    *int       `json:"evaluationScore"`
	Note               string     `json:"note"`
	Children           []QuotaCfg `json:"children"`
}

// 模板配置结构
type TemplateCfg struct {
	Id             string     `json:"id"`
	Name           string     `json:"name"`
	CreateUserCode string     `json:"createUserCode"`
	Note           string     `json:"note"`
	QuotaList      []QuotaCfg `json:"quotaList"`
}

// 用户配置结构
type UserCfg struct {
	Id       string `json:"id"`
	UserName string `json:"userName"`
	UserCode string `json:"userCode"`
	Password string `json:"password"`
	RoleId   string `json:"roleId"`
	DefaultUser bool `json:"defaultUser"`
}

// 角色配置结构
type RoleCfg struct {
	Id   string `json:"id"`
	Name string `json:"name"`
	Desc string `json:"desc"`
	DefaultRole bool `json:"defaultRole"`
}

// 内置数据配置
type dataCfg struct {
	Lock                sync.RWMutex  `json:"-"`
	AreaList            []string      `json:"areaList"`
	ChannelList         []string      `json:"channelList"`
	ProgramList         []string      `json:"programList"`
	TerminalList        []string      `json:"terminalList"`
	DefaultTemplateList []TemplateCfg `json:"defaultTemplateList"`
	DefaultUserList     []UserCfg     `json:"defaultUserList"`
	DefaultRoleList     []RoleCfg     `json:"defaultRoleList"`
}

var (
	Sys      = &SysCfg{}
	Ver      = &verCfg{}
	Data     = &dataCfg{}
	sysPath  = "./config/sys.json"
	verPath  = "./config/version.json"
	dataPath = "./config/data.json"
)

// Load 加载所有配置
func Load() {
	Sys.Load()
	Sys.UseLocalIP("eth0")
	Ver.Load()
	Data.Load()
}

// SysCfg.Load 加载系统配置
func (sys *SysCfg) Load() {
	file.ReadFromJson(sysPath, sys, &sys.Lock)
	sys.Mysql.Url = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", sys.Mysql.Username, sys.Mysql.Password, sys.Mysql.Host, sys.Mysql.Port, sys.Mysql.DataBase)
}

// SysCfg.UseLocalIP 使用本地IP
func (sys *SysCfg) UseLocalIP(name string) {
	ip := net.GetIpByName(name)
	if ip == "" || (sys.LocalIp == ip) {
		return
	}
	sys.LocalIp = ip
	sys.Write()
}

// SysCfg.Write 保存系统配置
func (sys *SysCfg) Write() {
	file.WriteToJson(sysPath, sys, &sys.Lock)
}

// verCfg.Load 加载版本配置
func (ver *verCfg) Load() {
	file.ReadFromJson(verPath, ver, &ver.Lock)
}

// verCfg.Write 保存版本配置
func (ver *verCfg) Write() {
	file.WriteToJson(verPath, ver, &ver.Lock)
}

// dataCfg.Load 加载版本配置
func (data *dataCfg) Load() {
	file.ReadFromJson(dataPath, data, &data.Lock)
}

// dataCfg.Write 保存版本配置
func (data *dataCfg) Write() {
	file.WriteToJson(dataPath, data, &data.Lock)
}
